/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package openfireconnection.group;

import java.util.ArrayList;
import java.util.Map;
import openfireconnection.group.model.GroupModel;
import openfireconnection.group.model.MemberModel;

/**
 * Interfaz para el manejo de grupos de OpenFire
 * @author Miguel y Juanan - Telecor
 */
public interface ManejadorGroups {
    /**
     * Obtiene los grupos de OpenFire
     * @return Devuelve un array con los grupos
     */
    public ArrayList<GroupModel> getGroups();
    
    /**
     * Obtiene un grupo de OpenFire
     * @param groupName Nombre del grupo que se va a obtener
     * @return Devuelve un grupo, sino se encuentra devuelve null
     */
    public GroupModel getGroup(String groupName);
    
    /**
     * Devuelve los nombres de los grupos de OpenFire
     * @return Devuelve un arraylist con los nombres
     */
    public ArrayList<String> getGroupsNames();
    
    /**
     * Devuelve el número de grupos existentes en OpenFire
     * @return Devuelve el número de OpenFire
     */
    public int getCountGroups();
    
    /**
     * Obtiene la descripción de un grupo de OpenFire
     * @param groupName Nombre del grupo de OpenFire
     * @return Devuelve la descripción del grupo de OpenFire
     */
    public String getGroupDescription(String groupName);
    
    /**
     * Devuelve los nombres de los miembros de un grupo de OpenFire
     * @param groupName Nombre del grupo de OpenFire
     * @return Devuelve un ArrayList con los nombres de los miembros del grupo
     */
    public ArrayList<String> getGroupMembersName(String groupName);
    
    /**
     * Devuelve los miembros de un grupo de OpenFire
     * @param groupName Nombre del grupo de OpenFire
     * @return Devuelve un ArrayList con los miembros del grupo de OpenFire
     */
    public ArrayList<MemberModel> getGroupMembers(String groupName);
    
    /**
     * Obtiene la lista de grupo a los que comparte el grupo de OpenFire
     * @param groupName Nombre del grupo de OpenFire
     * @return Devuelve 1 si se ha obtenido la lista, 0 sino
     */
    public String getGroupSharedNames(String groupName);
    
    /**
     * Devuelve los nombres de los grupos compartidos de OpenFire
     * @return Devuelve un ArrayList con los grupos compartidos de OpenFire
     */
    public ArrayList<String> getGroupsSharedName();
    
    /**
     * Devuelve la propiedad de un grupo de OpenFire
     * @param map Recibe un Map con la siguiente sintaxis:
     *  groupName -> nombre del grupo
     *  propertyName -> propiedad que se quiere obtener
     * @return 
     */
    public String getGroupProperty(Map map);
    
    /**
     * Actualiza el nombre de un grupo de OpenFire
     * @param map Recibe un Map con la siguiente sintaxis:
     *  groupName -> Nombre del grupo
     *  groupNameNew -> Nuevo nombre del grupo
     * @return 
     */
    public int updateGroupName(Map map);
    
    /**
     * Actualiza la descripción de un grupo de OpenFire
     * @param membreModel Grupo que va a ser actualizado
     * @return Devuelve 1 si la actualización es correcta, sino 0
     */
    public int updateGroupDescription(MemberModel membreModel);
    
    /**
     * Actualiza el miembro de un grupo de OpenFire
     * @param memberModel Recibe el miembro de un grupo que va a ser actualizado
     * @return Devuelve 1 si la actualización es correcta, sino 0
     */
    public int updateGroupMember(MemberModel memberModel);
    
    /**
     * Actualiza la propiedad de un grupo.
     * @param map Recibe un Map con la siguiente sintaxis:
     *  groupName: Nombre del grupo
     *  propertyName: Nombre de la propiedad
     *  propValue: Valor de la propiedad actualizado
     * @return Devuelve 1 si la actualización es correcta, sino 0
     */
    public int updateGroupProperty(Map map);
    
    /**
     * Inserta un miembro en un grupo de OpenFire
     * @param memberModel Recibe un miembro de OpenFire
     * @return Devuelve 1 si la inserción es correcta, sino 0
     */
    public int insertGroupMember(MemberModel memberModel);
    
    /**
     * Inserta un grupo en OpenFire
     * @param groupModel Recibe un grupo de OpenFire
     * @return Devuelve 1 si la inserción es correcta, sino 0
     */
    public int insertGroup(GroupModel groupModel);
    
    /**
     * Inserta la propiedad de un grupo en OpenFire
     * @param map Recibe un Map con la siguiente sintaxis:
     *  groupName -> Nombre del grupo de OpenFire
     *  propertyName -> Nombre de la propiedad de OpenFire
     *  valueProperty -> Valor de la propiedad
     * @return Devuelve 1 si la inserción es correcta, sino 0
     */
    public int insertGroupProperty(Map map);
    
    /**
     * Borra un miembro de un grupo de OpenFire
     * @param memberModel Miembro de OpenFire a ser borrado
     * @return Devuelve 1 si se ha borrado correctamente, sino 0
     */
    public int deleteGroupMember(MemberModel memberModel);
    
    /**
     * Borra un grupo de OpenFire
     * @param groupModel Grupo que va a ser borrado de OpenFire
     * @return Devuelve 1 si se ha borrado correctamente, sino 0
     */
    public int deleteGroup(GroupModel groupModel);
    
    /**
     * Borra las propiedades de un grupo de OpenFire
     * @param groupName Nombre del grupo de OpenFire
     * @return Devuelve el número de propiedades borradas
     */
    public int deletePropertys(String groupName);
}
